package com.alibaba.fastjson.pagination;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

public class Pagination<T> implements Serializable {

    /**
     *
     */
    private static final long serialVersionUID = 5038839734218582220L;

    private int totalResult = 0;

    private int totalPage = 1;

    private int pageIndex = 1;

    private int maxLength = 5;

    private int fromIndex = 0;

    private int toIndex = 0;

    private List<T> list = new ArrayList<T>();

    public Pagination() {

    }


    public void setTotalResult(int totalResult) {
        this.totalResult = totalResult;
    }


    public void setTotalPage(int totalPage) {
        this.totalPage = totalPage;
    }


    public void setPageIndex(int pageIndex) {
        this.pageIndex = pageIndex;
    }


    public void setMaxLength(int maxLength) {
        this.maxLength = maxLength;
    }


    public void setFromIndex(int fromIndex) {
        this.fromIndex = fromIndex;
    }


    public void setToIndex(int toIndex) {
        this.toIndex = toIndex;
    }


    public int getFromIndex() {
        return this.fromIndex;
    }

    public int getToIndex() {
        return this.toIndex;
    }

    public int getNextPage() {
        if (this.pageIndex < this.totalPage) {
            return this.pageIndex + 1;
        } else {
            return this.pageIndex;
        }
    }

    public int getPrevPage() {
        if (this.pageIndex > 1) {
            return this.pageIndex - 1;
        }
        return this.pageIndex;
    }

    /**
     * @return the currentPage
     */
    public int getPageIndex() {
        return pageIndex;
    }

    /**
     * @return the list
     */
    public List<T> getList() {
        if (list == null) {
            return new ArrayList<T>();
        }
        return new ArrayList<T>(list);
    }

    /**
     * @return the totalPage
     */
    public int getTotalPage() {
        return totalPage;
    }

    /**
     * @return the totalRecord
     */
    public int getTotalResult() {
        return totalResult;
    }

    public int getMaxLength() {
        return maxLength;
    }

    /**
     * @param totalResult
     * @param pageIndex
     * @param maxLength
     */
    public Pagination(int totalResult, int pageIndex, int maxLength) {
        if (maxLength > 0) {
            this.maxLength = maxLength;
        }
        if (totalResult > 0) {
            this.totalResult = totalResult;
        }
        if (pageIndex > 0) {
            this.pageIndex = pageIndex;
        }
        this.totalPage = this.totalResult / this.maxLength;
        if (this.totalResult % this.maxLength != 0) {
            this.totalPage = this.totalPage + 1;
        }
        if (this.totalPage == 0) {
            this.totalPage = 1;
        }
        if (this.pageIndex > this.totalPage) {
            this.pageIndex = this.totalPage;
        }
        if (this.pageIndex <= 0) {
            this.pageIndex = 1;
        }
        this.fromIndex = (this.pageIndex - 1) * maxLength;
        this.toIndex = this.fromIndex + maxLength;
        if (this.toIndex < 0) {
            this.toIndex = fromIndex;
        }
        if (this.toIndex > this.totalResult) {
            this.toIndex = this.totalResult;
        }

    }

    /**
     * @param datas the datas to set
     */
    public void setList(List<T> list) {
        this.list = list;
    }

    /*
     * (non-Javadoc)
     *
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {
        StringBuffer sb = new StringBuffer();
        sb.append("Pagination:\r\n");
        sb.append("\tpageIndex\t" + this.pageIndex + "\r\n");
        sb.append("\ttotalPage\t" + this.totalPage + "\r\n");
        sb.append("\tmaxLength\t" + this.maxLength + "\r\n");
        sb.append("\ttotalResult\t" + this.totalResult + "\r\n");
        for (T t : list) {
            sb.append(t + "\r\n");
        }
        return sb.toString();
    }

}
